knitr::opts_chunk$set(echo = TRUE)
rm(list = ls())

most recent data Ayano shared

data <- read.csv("~/Rprojects/ayano/PES_010v6(selected).csv")
#colnames(data)
#time phase is tSSNA
units <- c("Speaker", "Role", "Phase")

codes_1 <- c("Functions", "Aesthetics", "User", "Vision", "Prototyping") # design actions codes
codes_2 <- c("CA", "ALoK", "CSU", "GCA", "Projective","Regulative","Relational") # shared epistemic agency codes

conversations = c("Role","Phase")

# hoo_rules <- conversation_rules(
#   (TimePhase %in% UNIT$TimePhase & Role %in% UNIT$Role)
# )

notes: accum_1 and set_1 are for design action codes; accum_2 and set_2 are for shared epistemic agency codes

accum_1 = ena.accumulate.data(units = data[,units],
                              conversation = data[,conversations],
                              codes = data[,codes_1],
                              window.size.back = 4)

Note: Not doing means rotation so I can compare everything in the same space

set_1 = ena.make.set(accum_1)
accum_2 = ena.accumulate.data(units = data[,units],
                              conversation = data[,conversations],
                              codes = data[,codes_2],
                              window.size.back = 4)
set_2 = ena.make.set(accum_2)

Model 1: design action codes

Plot 1: Mean Network


plot = ena.plot(set_1, scale.to = "points", title = "Groups and Means")  %>%
       ena.plot.points(points = as.matrix(set_1$points)) %>% 
       ena.plot.group(point = as.matrix(set_1$points),
                      colors = c("black"), confidence.interval = "box") %>% 
      ena.plot.network(network = colMeans(as.matrix(set_1$line.weights)),colors = "black")
plot$plot
NA

Plot 2: All Means


#get list of time phases and groups loop over or use map function

phases = unique(set_1$points$Phase)

groups = unique(set_1$points$Role)

# col_list = list(pd = list("darkolivegreen2","darkolivegreen3","darkolivegreen4"),
#                 en = list("darkorange2","darkorange3","darkorange4"),
#                 sd = list("darkorchid1","darkorchid2","darkorchid3"))

col_list_2 = c("red",
              "blue",
              "green")


x = ena.plot(set_1, title = "Group Means by Phase")

for (i in 1:length(phases)){
  for (j in 1:length(groups)){
    points = set_1$points %>% filter(Phase == phases[i], Role == groups[j]) %>% as.matrix()
    x = x %>% 
      ena.plot.group(points = points,
                     colors = col_list_2[i],
                     confidence.interval = "none",
                     labels = paste(phases[i],groups[j]))
  }
}

x = x %>% ena.plot.network(network = colMeans(as.matrix(set_1$line.weights))*0,colors = "black")
x
NA

Stats:

reg_dat_design = set_1$points

mod_x_design = lm(SVD1 ~ as.factor(Phase) + Role, data = reg_dat_design)
mod_y_design = lm(SVD2 ~ as.factor(Phase) + Role, data = reg_dat_design)


summary(mod_x_design)

Call:
lm(formula = SVD1 ~ as.factor(Phase) + Role, data = reg_dat_design)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.33875 -0.19734  0.00415  0.08239  0.83734 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)          0.21470    0.10603   2.025 0.052504 .  
as.factor(Phase)2   -0.46976    0.11548  -4.068 0.000350 ***
as.factor(Phase)3   -0.88394    0.11846  -7.462 3.98e-08 ***
RoleProductDesigner  0.06451    0.12087   0.534 0.597773    
RoleServiceDesigner  0.51766    0.11846   4.370 0.000155 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2762 on 28 degrees of freedom
Multiple R-squared:  0.7305,    Adjusted R-squared:  0.692 
F-statistic: 18.97 on 4 and 28 DF,  p-value: 1.199e-07
summary(mod_y_design)

Call:
lm(formula = SVD2 ~ as.factor(Phase) + Role, data = reg_dat_design)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.45072 -0.08698  0.03115  0.07065  0.31972 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)         -0.005242   0.064602  -0.081  0.93591    
as.factor(Phase)2   -0.254687   0.070361  -3.620  0.00115 ** 
as.factor(Phase)3   -0.153102   0.072179  -2.121  0.04290 *  
RoleProductDesigner  0.362531   0.073644   4.923 3.43e-05 ***
RoleServiceDesigner  0.043143   0.072179   0.598  0.55483    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1683 on 28 degrees of freedom
Multiple R-squared:  0.6026,    Adjusted R-squared:  0.5458 
F-statistic: 10.61 on 4 and 28 DF,  p-value: 2.313e-05

Marginal means - x

library(emmeans)

emm_x_design = emmeans(mod_x_design, specs = pairwise ~ Role|Phase, weights = "proportional")
emm_x_design = emmeans(mod_x_design, specs = pairwise ~ Phase|Role, weights = "proportional")
emm_x_design$contrasts
Role = Engineer:
 contrast        estimate    SE df t.ratio p.value
 Phase1 - Phase2    0.470 0.115 28   4.068  0.0010
 Phase1 - Phase3    0.884 0.118 28   7.462  <.0001
 Phase2 - Phase3    0.414 0.121 28   3.427  0.0053

Role = ProductDesigner:
 contrast        estimate    SE df t.ratio p.value
 Phase1 - Phase2    0.470 0.115 28   4.068  0.0010
 Phase1 - Phase3    0.884 0.118 28   7.462  <.0001
 Phase2 - Phase3    0.414 0.121 28   3.427  0.0053

Role = ServiceDesigner:
 contrast        estimate    SE df t.ratio p.value
 Phase1 - Phase2    0.470 0.115 28   4.068  0.0010
 Phase1 - Phase3    0.884 0.118 28   7.462  <.0001
 Phase2 - Phase3    0.414 0.121 28   3.427  0.0053

P value adjustment: tukey method for comparing a family of 3 estimates 

Marginal means - y

emm_y_design = emmeans(mod_y_design, specs = pairwise ~ Role|Phase, weights = "proportional")
emm_y_design = emmeans(mod_y_design, specs = pairwise ~ Phase|Role, weights = "proportional")
emm_y_design$contrasts
Role = Engineer:
 contrast        estimate     SE df t.ratio p.value
 Phase1 - Phase2    0.255 0.0704 28   3.620  0.0032
 Phase1 - Phase3    0.153 0.0722 28   2.121  0.1037
 Phase2 - Phase3   -0.102 0.0736 28  -1.379  0.3650

Role = ProductDesigner:
 contrast        estimate     SE df t.ratio p.value
 Phase1 - Phase2    0.255 0.0704 28   3.620  0.0032
 Phase1 - Phase3    0.153 0.0722 28   2.121  0.1037
 Phase2 - Phase3   -0.102 0.0736 28  -1.379  0.3650

Role = ServiceDesigner:
 contrast        estimate     SE df t.ratio p.value
 Phase1 - Phase2    0.255 0.0704 28   3.620  0.0032
 Phase1 - Phase3    0.153 0.0722 28   2.121  0.1037
 Phase2 - Phase3   -0.102 0.0736 28  -1.379  0.3650

P value adjustment: tukey method for comparing a family of 3 estimates 

Calculate eff sizes

Plot network subtractions for moderate to high eff sizes

mean1 = set_1$points %>% dplyr::filter(Phase == 1, Role == "Engineer")
mean2 = set_1$points %>% dplyr::filter(Phase == 1, Role == "ProductDesigner")

lw_1 = set_1$line.weights %>% dplyr::filter(Phase == 1, Role == "Engineer") %>% as.matrix() %>% colMeans()
lw_2 = set_1$line.weights %>% dplyr::filter(Phase == 1, Role == "ProductDesigner") %>% as.matrix() %>% colMeans()


plot = ena.plot(set_1, title = "Network Subtractions") %>% 
          ena.plot.points(points = mean1, colors = c("blue")) %>% 
          ena.plot.points(points = mean2, colors = c("red")) %>% 
          ena.plot.group(point = mean1, colors =c("blue"), 
                         confidence.interval = "box") %>% 
          ena.plot.group(point = mean2, colors =c("red"), 
                         confidence.interval = "box") %>%
          ena.plot.network(network = lw_1 - lw_2, colors = c("blue","red"))

plot$plot
NA

Model 2: Epistemic Agency Codes

Plot 1: Mean Network

plot = ena.plot(set_2, scale.to = "points", title = "Groups and Means")  %>%
       ena.plot.points(points = as.matrix(set_2$points)) %>% 
       ena.plot.group(point = as.matrix(set_2$points),
                      colors = c("black"), confidence.interval = "box") %>% 
      ena.plot.network(network = colMeans(as.matrix(set_2$line.weights)),colors = "black")
plot$plot
NA

Plot 2: All Means


phases = unique(set_2$points$Phase)

groups = unique(set_2$points$Role)

# col_list = list(pd = list("darkolivegreen2","darkolivegreen3","darkolivegreen4"),
#                 en = list("darkorange2","darkorange3","darkorange4"),
#                 sd = list("darkorchid1","darkorchid2","darkorchid3"))

col_list_2 = c("red",
              "blue",
              "green")


x = ena.plot(set_2, title = "Group Means by Phase")

for (i in 1:length(phases)){
  for (j in 1:length(groups)){
    points = set_2$points %>% filter(Phase == phases[i], Role == groups[j]) %>% as.matrix()
    x = x %>% 
      ena.plot.group(points = points,
                     colors = col_list_2[i],
                     confidence.interval = "none",
                     labels = paste(phases[i],groups[j]))
  }
}

x = x %>% ena.plot.network(network = colMeans(as.matrix(set_2$line.weights))*0,colors = "black")
x
reg_dat_agency = set_2$points

mod_x_agency = lm(SVD1 ~ as.factor(Phase) + Role, data = reg_dat_agency)
mod_y_agency = lm(SVD2 ~ as.factor(Phase) + Role, data = reg_dat_agency)


summary(mod_x_agency)

Call:
lm(formula = SVD1 ~ as.factor(Phase) + Role, data = reg_dat_agency)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.56585 -0.18405 -0.01777  0.20477  0.37706 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)          -0.2131     0.1018  -2.093  0.04553 *  
as.factor(Phase)2     0.5169     0.1109   4.661  7.0e-05 ***
as.factor(Phase)3     0.8846     0.1138   7.776  1.8e-08 ***
RoleProductDesigner  -0.3751     0.1161  -3.232  0.00314 ** 
RoleServiceDesigner  -0.2811     0.1138  -2.471  0.01984 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2653 on 28 degrees of freedom
Multiple R-squared:   0.72, Adjusted R-squared:  0.6801 
F-statistic:    18 on 4 and 28 DF,  p-value: 2.013e-07
summary(mod_y_agency)

Call:
lm(formula = SVD2 ~ as.factor(Phase) + Role, data = reg_dat_agency)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.44439 -0.20784  0.00443  0.13841  0.64717 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)           0.1997     0.1076   1.856 0.074047 .  
as.factor(Phase)2    -0.2443     0.1172  -2.085 0.046353 *  
as.factor(Phase)3    -0.1860     0.1202  -1.547 0.133174    
RoleProductDesigner  -0.4510     0.1227  -3.677 0.000993 ***
RoleServiceDesigner   0.2432     0.1202   2.023 0.052759 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2803 on 28 degrees of freedom
Multiple R-squared:  0.5911,    Adjusted R-squared:  0.5327 
F-statistic: 10.12 on 4 and 28 DF,  p-value: 3.39e-05

Marginal means - x

emm_x_agency1 = emmeans(mod_x_agency, specs = pairwise ~ Role|Phase, weights = "proportional")
emm_x_agency2 = emmeans(mod_x_agency, specs = pairwise ~ Phase|Role, weights = "proportional")
emm_x_agency1$contrasts
Phase = 1:
 contrast                          estimate    SE df t.ratio p.value
 Engineer - ProductDesigner          0.3751 0.116 28   3.232  0.0085
 Engineer - ServiceDesigner          0.2811 0.114 28   2.471  0.0504
 ProductDesigner - ServiceDesigner  -0.0941 0.111 28  -0.848  0.6768

Phase = 2:
 contrast                          estimate    SE df t.ratio p.value
 Engineer - ProductDesigner          0.3751 0.116 28   3.232  0.0085
 Engineer - ServiceDesigner          0.2811 0.114 28   2.471  0.0504
 ProductDesigner - ServiceDesigner  -0.0941 0.111 28  -0.848  0.6768

Phase = 3:
 contrast                          estimate    SE df t.ratio p.value
 Engineer - ProductDesigner          0.3751 0.116 28   3.232  0.0085
 Engineer - ServiceDesigner          0.2811 0.114 28   2.471  0.0504
 ProductDesigner - ServiceDesigner  -0.0941 0.111 28  -0.848  0.6768

P value adjustment: tukey method for comparing a family of 3 estimates 
emm_x_agency2$contrasts
Role = Engineer:
 contrast        estimate    SE df t.ratio p.value
 Phase1 - Phase2   -0.517 0.111 28  -4.661  0.0002
 Phase1 - Phase3   -0.885 0.114 28  -7.776  <.0001
 Phase2 - Phase3   -0.368 0.116 28  -3.168  0.0100

Role = ProductDesigner:
 contrast        estimate    SE df t.ratio p.value
 Phase1 - Phase2   -0.517 0.111 28  -4.661  0.0002
 Phase1 - Phase3   -0.885 0.114 28  -7.776  <.0001
 Phase2 - Phase3   -0.368 0.116 28  -3.168  0.0100

Role = ServiceDesigner:
 contrast        estimate    SE df t.ratio p.value
 Phase1 - Phase2   -0.517 0.111 28  -4.661  0.0002
 Phase1 - Phase3   -0.885 0.114 28  -7.776  <.0001
 Phase2 - Phase3   -0.368 0.116 28  -3.168  0.0100

P value adjustment: tukey method for comparing a family of 3 estimates 

Marginal means - y

emm_y_agency1 = emmeans(mod_y_agency, specs = pairwise ~ Role|Phase, weights = "proportional")
emm_y_agency2 = emmeans(mod_y_agency, specs = pairwise ~ Phase|Role, weights = "proportional")
emm_y_agency1$contrasts
Phase = 1:
 contrast                          estimate    SE df t.ratio p.value
 Engineer - ProductDesigner           0.451 0.123 28   3.677  0.0028
 Engineer - ServiceDesigner          -0.243 0.120 28  -2.023  0.1254
 ProductDesigner - ServiceDesigner   -0.694 0.117 28  -5.923  <.0001

Phase = 2:
 contrast                          estimate    SE df t.ratio p.value
 Engineer - ProductDesigner           0.451 0.123 28   3.677  0.0028
 Engineer - ServiceDesigner          -0.243 0.120 28  -2.023  0.1254
 ProductDesigner - ServiceDesigner   -0.694 0.117 28  -5.923  <.0001

Phase = 3:
 contrast                          estimate    SE df t.ratio p.value
 Engineer - ProductDesigner           0.451 0.123 28   3.677  0.0028
 Engineer - ServiceDesigner          -0.243 0.120 28  -2.023  0.1254
 ProductDesigner - ServiceDesigner   -0.694 0.117 28  -5.923  <.0001

P value adjustment: tukey method for comparing a family of 3 estimates 
emm_y_agency2$contrasts
Role = Engineer:
 contrast        estimate    SE df t.ratio p.value
 Phase1 - Phase2   0.2443 0.117 28   2.085  0.1113
 Phase1 - Phase3   0.1860 0.120 28   1.547  0.2852
 Phase2 - Phase3  -0.0584 0.123 28  -0.476  0.8832

Role = ProductDesigner:
 contrast        estimate    SE df t.ratio p.value
 Phase1 - Phase2   0.2443 0.117 28   2.085  0.1113
 Phase1 - Phase3   0.1860 0.120 28   1.547  0.2852
 Phase2 - Phase3  -0.0584 0.123 28  -0.476  0.8832

Role = ServiceDesigner:
 contrast        estimate    SE df t.ratio p.value
 Phase1 - Phase2   0.2443 0.117 28   2.085  0.1113
 Phase1 - Phase3   0.1860 0.120 28   1.547  0.2852
 Phase2 - Phase3  -0.0584 0.123 28  -0.476  0.8832

P value adjustment: tukey method for comparing a family of 3 estimates 

Calculate eff sizes

Plot network subtractions for moderate to high eff sizes

mean1 = set_1$points %>% dplyr::filter(Phase == 1, Role == "Engineer")
mean2 = set_1$points %>% dplyr::filter(Phase == 1, Role == "ProductDesigner")

lw_1 = set_1$line.weights %>% dplyr::filter(Phase == 1, Role == "Engineer") %>% as.matrix() %>% colMeans()
lw_2 = set_1$line.weights %>% dplyr::filter(Phase == 1, Role == "ProductDesigner") %>% as.matrix() %>% colMeans()


plot = ena.plot(set_1, title = "Network Subtractions") %>% 
          ena.plot.points(points = mean1, colors = c("blue")) %>% 
          ena.plot.points(points = mean2, colors = c("red")) %>% 
          ena.plot.group(point = mean1, colors =c("blue"), 
                         confidence.interval = "box") %>% 
          ena.plot.group(point = mean2, colors =c("red"), 
                         confidence.interval = "box") %>%
          ena.plot.network(network = lw_1 - lw_2, colors = c("blue","red"))

plot$plot
LS0tCnRpdGxlOiAiSkxBMC0yMDIzLUVOQSIKYXV0aG9yOiAiWmFjaCAmIFl1YW5ydSIKZGF0ZTogIjIwMjMtMDUtMjMiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIGRmX3ByaW50OiBwYWdlZAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwplZGl0b3Jfb3B0aW9uczogCiAgbWFya2Rvd246IAogICAgd3JhcDogc2VudGVuY2UKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1UUlVFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKYGBge3J9CnJtKGxpc3QgPSBscygpKQpgYGAKCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KHJFTkEpCmxpYnJhcnkobWFncml0dHIpCmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCm1vc3QgcmVjZW50IGRhdGEgQXlhbm8gc2hhcmVkCmBgYHtyfQpkYXRhIDwtIHJlYWQuY3N2KCJ+L1Jwcm9qZWN0cy9heWFuby9QRVNfMDEwdjYoc2VsZWN0ZWQpLmNzdiIpCiNjb2xuYW1lcyhkYXRhKQojdGltZSBwaGFzZSBpcyB0U1NOQQpgYGAKCmBgYHtyfQp1bml0cyA8LSBjKCJTcGVha2VyIiwgIlJvbGUiLCAiUGhhc2UiKQoKY29kZXNfMSA8LSBjKCJGdW5jdGlvbnMiLCAiQWVzdGhldGljcyIsICJVc2VyIiwgIlZpc2lvbiIsICJQcm90b3R5cGluZyIpICMgZGVzaWduIGFjdGlvbnMgY29kZXMKY29kZXNfMiA8LSBjKCJDQSIsICJBTG9LIiwgIkNTVSIsICJHQ0EiLCAiUHJvamVjdGl2ZSIsIlJlZ3VsYXRpdmUiLCJSZWxhdGlvbmFsIikgIyBzaGFyZWQgZXBpc3RlbWljIGFnZW5jeSBjb2RlcwoKY29udmVyc2F0aW9ucyA9IGMoIlJvbGUiLCJQaGFzZSIpCgojIGhvb19ydWxlcyA8LSBjb252ZXJzYXRpb25fcnVsZXMoCiMgICAoVGltZVBoYXNlICVpbiUgVU5JVCRUaW1lUGhhc2UgJiBSb2xlICVpbiUgVU5JVCRSb2xlKQojICkKYGBgCgpub3RlczogYWNjdW1fMSBhbmQgc2V0XzEgYXJlIGZvciBkZXNpZ24gYWN0aW9uIGNvZGVzOyBhY2N1bV8yIGFuZCBzZXRfMiBhcmUgZm9yIHNoYXJlZCBlcGlzdGVtaWMgYWdlbmN5IGNvZGVzCgpgYGB7cn0KYWNjdW1fMSA9IGVuYS5hY2N1bXVsYXRlLmRhdGEodW5pdHMgPSBkYXRhWyx1bml0c10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNhdGlvbiA9IGRhdGFbLGNvbnZlcnNhdGlvbnNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlcyA9IGRhdGFbLGNvZGVzXzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2l6ZS5iYWNrID0gNCkKYGBgCgoKTm90ZTogTm90IGRvaW5nIG1lYW5zIHJvdGF0aW9uIHNvIEkgY2FuIGNvbXBhcmUgZXZlcnl0aGluZyBpbiB0aGUgc2FtZSBzcGFjZQoKYGBge3J9CnNldF8xID0gZW5hLm1ha2Uuc2V0KGFjY3VtXzEpCmBgYAoKCmBgYHtyfQphY2N1bV8yID0gZW5hLmFjY3VtdWxhdGUuZGF0YSh1bml0cyA9IGRhdGFbLHVuaXRzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uID0gZGF0YVssY29udmVyc2F0aW9uc10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzID0gZGF0YVssY29kZXNfMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zaXplLmJhY2sgPSA0KQpgYGAKCmBgYHtyfQpzZXRfMiA9IGVuYS5tYWtlLnNldChhY2N1bV8yKQpgYGAKCgpNb2RlbCAxOiBkZXNpZ24gYWN0aW9uIGNvZGVzCgpQbG90IDE6IE1lYW4gTmV0d29yawoKYGBge3J9CgpwbG90ID0gZW5hLnBsb3Qoc2V0XzEsIHNjYWxlLnRvID0gInBvaW50cyIsIHRpdGxlID0gIkdyb3VwcyBhbmQgTWVhbnMiKSAgJT4lCiAgICAgICBlbmEucGxvdC5wb2ludHMocG9pbnRzID0gYXMubWF0cml4KHNldF8xJHBvaW50cykpICU+JSAKICAgICAgIGVuYS5wbG90Lmdyb3VwKHBvaW50ID0gYXMubWF0cml4KHNldF8xJHBvaW50cyksCiAgICAgICAgICAgICAgICAgICAgICBjb2xvcnMgPSBjKCJibGFjayIpLCBjb25maWRlbmNlLmludGVydmFsID0gImJveCIpICU+JSAKICAgICAgZW5hLnBsb3QubmV0d29yayhuZXR3b3JrID0gY29sTWVhbnMoYXMubWF0cml4KHNldF8xJGxpbmUud2VpZ2h0cykpLGNvbG9ycyA9ICJibGFjayIpCnBsb3QkcGxvdAoKYGBgCgpQbG90IDI6IEFsbCBNZWFucwpgYGB7cn0KCiNnZXQgbGlzdCBvZiB0aW1lIHBoYXNlcyBhbmQgZ3JvdXBzIGxvb3Agb3ZlciBvciB1c2UgbWFwIGZ1bmN0aW9uCgpwaGFzZXMgPSB1bmlxdWUoc2V0XzEkcG9pbnRzJFBoYXNlKQoKZ3JvdXBzID0gdW5pcXVlKHNldF8xJHBvaW50cyRSb2xlKQoKIyBjb2xfbGlzdCA9IGxpc3QocGQgPSBsaXN0KCJkYXJrb2xpdmVncmVlbjIiLCJkYXJrb2xpdmVncmVlbjMiLCJkYXJrb2xpdmVncmVlbjQiKSwKIyAgICAgICAgICAgICAgICAgZW4gPSBsaXN0KCJkYXJrb3JhbmdlMiIsImRhcmtvcmFuZ2UzIiwiZGFya29yYW5nZTQiKSwKIyAgICAgICAgICAgICAgICAgc2QgPSBsaXN0KCJkYXJrb3JjaGlkMSIsImRhcmtvcmNoaWQyIiwiZGFya29yY2hpZDMiKSkKCmNvbF9saXN0XzIgPSBjKCJyZWQiLAogICAgICAgICAgICAgICJibHVlIiwKICAgICAgICAgICAgICAiZ3JlZW4iKQoKCnggPSBlbmEucGxvdChzZXRfMSwgdGl0bGUgPSAiR3JvdXAgTWVhbnMgYnkgUGhhc2UiKQoKZm9yIChpIGluIDE6bGVuZ3RoKHBoYXNlcykpewogIGZvciAoaiBpbiAxOmxlbmd0aChncm91cHMpKXsKICAgIHBvaW50cyA9IHNldF8xJHBvaW50cyAlPiUgZmlsdGVyKFBoYXNlID09IHBoYXNlc1tpXSwgUm9sZSA9PSBncm91cHNbal0pICU+JSBhcy5tYXRyaXgoKQogICAgeCA9IHggJT4lIAogICAgICBlbmEucGxvdC5ncm91cChwb2ludHMgPSBwb2ludHMsCiAgICAgICAgICAgICAgICAgICAgIGNvbG9ycyA9IGNvbF9saXN0XzJbaV0sCiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2UuaW50ZXJ2YWwgPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHBhc3RlKHBoYXNlc1tpXSxncm91cHNbal0pKQogIH0KfQoKeCA9IHggJT4lIGVuYS5wbG90Lm5ldHdvcmsobmV0d29yayA9IGNvbE1lYW5zKGFzLm1hdHJpeChzZXRfMSRsaW5lLndlaWdodHMpKSowLGNvbG9ycyA9ICJibGFjayIpCngKCmBgYAoKClN0YXRzOgoKYGBge3J9CnJlZ19kYXRfZGVzaWduID0gc2V0XzEkcG9pbnRzCgptb2RfeF9kZXNpZ24gPSBsbShTVkQxIH4gYXMuZmFjdG9yKFBoYXNlKSArIFJvbGUsIGRhdGEgPSByZWdfZGF0X2Rlc2lnbikKbW9kX3lfZGVzaWduID0gbG0oU1ZEMiB+IGFzLmZhY3RvcihQaGFzZSkgKyBSb2xlLCBkYXRhID0gcmVnX2RhdF9kZXNpZ24pCgoKc3VtbWFyeShtb2RfeF9kZXNpZ24pCnN1bW1hcnkobW9kX3lfZGVzaWduKQoKYGBgCgpNYXJnaW5hbCBtZWFucyAtIHgKCmBgYHtyfQpsaWJyYXJ5KGVtbWVhbnMpCgplbW1feF9kZXNpZ24gPSBlbW1lYW5zKG1vZF94X2Rlc2lnbiwgc3BlY3MgPSBwYWlyd2lzZSB+IFJvbGV8UGhhc2UsIHdlaWdodHMgPSAicHJvcG9ydGlvbmFsIikKZW1tX3hfZGVzaWduID0gZW1tZWFucyhtb2RfeF9kZXNpZ24sIHNwZWNzID0gcGFpcndpc2UgfiBQaGFzZXxSb2xlLCB3ZWlnaHRzID0gInByb3BvcnRpb25hbCIpCmVtbV94X2Rlc2lnbiRjb250cmFzdHMKCmBgYAoKTWFyZ2luYWwgbWVhbnMgLSB5CmBgYHtyfQplbW1feV9kZXNpZ24xID0gZW1tZWFucyhtb2RfeV9kZXNpZ24sIHNwZWNzID0gcGFpcndpc2UgfiBSb2xlfFBoYXNlLCB3ZWlnaHRzID0gInByb3BvcnRpb25hbCIpCmVtbV95X2Rlc2lnbjIgPSBlbW1lYW5zKG1vZF95X2Rlc2lnbiwgc3BlY3MgPSBwYWlyd2lzZSB+IFBoYXNlfFJvbGUsIHdlaWdodHMgPSAicHJvcG9ydGlvbmFsIikKZW1tX3lfZGVzaWduMSRjb250cmFzdHMKZW1tX3lfZGVzaWduMiRjb250cmFzdHMKYGBgCgpDYWxjdWxhdGUgZWZmIHNpemVzCmBgYHtyfQoKYGBgCgpQbG90IG5ldHdvcmsgc3VidHJhY3Rpb25zIGZvciBtb2RlcmF0ZSB0byBoaWdoIGVmZiBzaXplcwpgYGB7cn0KbWVhbjEgPSBzZXRfMSRwb2ludHMgJT4lIGRwbHlyOjpmaWx0ZXIoUGhhc2UgPT0gMSwgUm9sZSA9PSAiRW5naW5lZXIiKQptZWFuMiA9IHNldF8xJHBvaW50cyAlPiUgZHBseXI6OmZpbHRlcihQaGFzZSA9PSAxLCBSb2xlID09ICJQcm9kdWN0RGVzaWduZXIiKQoKbHdfMSA9IHNldF8xJGxpbmUud2VpZ2h0cyAlPiUgZHBseXI6OmZpbHRlcihQaGFzZSA9PSAxLCBSb2xlID09ICJFbmdpbmVlciIpICU+JSBhcy5tYXRyaXgoKSAlPiUgY29sTWVhbnMoKQpsd18yID0gc2V0XzEkbGluZS53ZWlnaHRzICU+JSBkcGx5cjo6ZmlsdGVyKFBoYXNlID09IDEsIFJvbGUgPT0gIlByb2R1Y3REZXNpZ25lciIpICU+JSBhcy5tYXRyaXgoKSAlPiUgY29sTWVhbnMoKQoKCnBsb3QgPSBlbmEucGxvdChzZXRfMSwgdGl0bGUgPSAiTmV0d29yayBTdWJ0cmFjdGlvbnMiKSAlPiUgCiAgICAgICAgICBlbmEucGxvdC5wb2ludHMocG9pbnRzID0gbWVhbjEsIGNvbG9ycyA9IGMoImJsdWUiKSkgJT4lIAogICAgICAgICAgZW5hLnBsb3QucG9pbnRzKHBvaW50cyA9IG1lYW4yLCBjb2xvcnMgPSBjKCJyZWQiKSkgJT4lIAogICAgICAgICAgZW5hLnBsb3QuZ3JvdXAocG9pbnQgPSBtZWFuMSwgY29sb3JzID1jKCJibHVlIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlkZW5jZS5pbnRlcnZhbCA9ICJib3giKSAlPiUgCiAgICAgICAgICBlbmEucGxvdC5ncm91cChwb2ludCA9IG1lYW4yLCBjb2xvcnMgPWMoInJlZCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2UuaW50ZXJ2YWwgPSAiYm94IikgJT4lCiAgICAgICAgICBlbmEucGxvdC5uZXR3b3JrKG5ldHdvcmsgPSBsd18xIC0gbHdfMiwgY29sb3JzID0gYygiYmx1ZSIsInJlZCIpKQoKcGxvdCRwbG90CgpgYGAKCk1vZGVsIDI6IEVwaXN0ZW1pYyBBZ2VuY3kgQ29kZXMKClBsb3QgMTogTWVhbiBOZXR3b3JrCgpgYGB7cn0KcGxvdCA9IGVuYS5wbG90KHNldF8yLCBzY2FsZS50byA9ICJwb2ludHMiLCB0aXRsZSA9ICJHcm91cHMgYW5kIE1lYW5zIikgICU+JQogICAgICAgZW5hLnBsb3QucG9pbnRzKHBvaW50cyA9IGFzLm1hdHJpeChzZXRfMiRwb2ludHMpKSAlPiUgCiAgICAgICBlbmEucGxvdC5ncm91cChwb2ludCA9IGFzLm1hdHJpeChzZXRfMiRwb2ludHMpLAogICAgICAgICAgICAgICAgICAgICAgY29sb3JzID0gYygiYmxhY2siKSwgY29uZmlkZW5jZS5pbnRlcnZhbCA9ICJib3giKSAlPiUgCiAgICAgIGVuYS5wbG90Lm5ldHdvcmsobmV0d29yayA9IGNvbE1lYW5zKGFzLm1hdHJpeChzZXRfMiRsaW5lLndlaWdodHMpKSxjb2xvcnMgPSAiYmxhY2siKQpwbG90JHBsb3QKCmBgYAoKUGxvdCAyOiBBbGwgTWVhbnMKYGBge3J9CgpwaGFzZXMgPSB1bmlxdWUoc2V0XzIkcG9pbnRzJFBoYXNlKQoKZ3JvdXBzID0gdW5pcXVlKHNldF8yJHBvaW50cyRSb2xlKQoKIyBjb2xfbGlzdCA9IGxpc3QocGQgPSBsaXN0KCJkYXJrb2xpdmVncmVlbjIiLCJkYXJrb2xpdmVncmVlbjMiLCJkYXJrb2xpdmVncmVlbjQiKSwKIyAgICAgICAgICAgICAgICAgZW4gPSBsaXN0KCJkYXJrb3JhbmdlMiIsImRhcmtvcmFuZ2UzIiwiZGFya29yYW5nZTQiKSwKIyAgICAgICAgICAgICAgICAgc2QgPSBsaXN0KCJkYXJrb3JjaGlkMSIsImRhcmtvcmNoaWQyIiwiZGFya29yY2hpZDMiKSkKCmNvbF9saXN0XzIgPSBjKCJyZWQiLAogICAgICAgICAgICAgICJibHVlIiwKICAgICAgICAgICAgICAiZ3JlZW4iKQoKCnggPSBlbmEucGxvdChzZXRfMiwgdGl0bGUgPSAiR3JvdXAgTWVhbnMgYnkgUGhhc2UiKQoKZm9yIChpIGluIDE6bGVuZ3RoKHBoYXNlcykpewogIGZvciAoaiBpbiAxOmxlbmd0aChncm91cHMpKXsKICAgIHBvaW50cyA9IHNldF8yJHBvaW50cyAlPiUgZmlsdGVyKFBoYXNlID09IHBoYXNlc1tpXSwgUm9sZSA9PSBncm91cHNbal0pICU+JSBhcy5tYXRyaXgoKQogICAgeCA9IHggJT4lIAogICAgICBlbmEucGxvdC5ncm91cChwb2ludHMgPSBwb2ludHMsCiAgICAgICAgICAgICAgICAgICAgIGNvbG9ycyA9IGNvbF9saXN0XzJbaV0sCiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2UuaW50ZXJ2YWwgPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHBhc3RlKHBoYXNlc1tpXSxncm91cHNbal0pKQogIH0KfQoKeCA9IHggJT4lIGVuYS5wbG90Lm5ldHdvcmsobmV0d29yayA9IGNvbE1lYW5zKGFzLm1hdHJpeChzZXRfMiRsaW5lLndlaWdodHMpKSowLGNvbG9ycyA9ICJibGFjayIpCngKYGBgCgpgYGB7cn0KcmVnX2RhdF9hZ2VuY3kgPSBzZXRfMiRwb2ludHMKCm1vZF94X2FnZW5jeSA9IGxtKFNWRDEgfiBhcy5mYWN0b3IoUGhhc2UpICsgUm9sZSwgZGF0YSA9IHJlZ19kYXRfYWdlbmN5KQptb2RfeV9hZ2VuY3kgPSBsbShTVkQyIH4gYXMuZmFjdG9yKFBoYXNlKSArIFJvbGUsIGRhdGEgPSByZWdfZGF0X2FnZW5jeSkKCgpzdW1tYXJ5KG1vZF94X2FnZW5jeSkKc3VtbWFyeShtb2RfeV9hZ2VuY3kpCmBgYApNYXJnaW5hbCBtZWFucyAtIHgKCmBgYHtyfQplbW1feF9hZ2VuY3kxID0gZW1tZWFucyhtb2RfeF9hZ2VuY3ksIHNwZWNzID0gcGFpcndpc2UgfiBSb2xlfFBoYXNlLCB3ZWlnaHRzID0gInByb3BvcnRpb25hbCIpCmVtbV94X2FnZW5jeTIgPSBlbW1lYW5zKG1vZF94X2FnZW5jeSwgc3BlY3MgPSBwYWlyd2lzZSB+IFBoYXNlfFJvbGUsIHdlaWdodHMgPSAicHJvcG9ydGlvbmFsIikKZW1tX3hfYWdlbmN5MSRjb250cmFzdHMKZW1tX3hfYWdlbmN5MiRjb250cmFzdHMKCmBgYAoKTWFyZ2luYWwgbWVhbnMgLSB5CmBgYHtyfQplbW1feV9hZ2VuY3kxID0gZW1tZWFucyhtb2RfeV9hZ2VuY3ksIHNwZWNzID0gcGFpcndpc2UgfiBSb2xlfFBoYXNlLCB3ZWlnaHRzID0gInByb3BvcnRpb25hbCIpCmVtbV95X2FnZW5jeTIgPSBlbW1lYW5zKG1vZF95X2FnZW5jeSwgc3BlY3MgPSBwYWlyd2lzZSB+IFBoYXNlfFJvbGUsIHdlaWdodHMgPSAicHJvcG9ydGlvbmFsIikKZW1tX3lfYWdlbmN5MSRjb250cmFzdHMKZW1tX3lfYWdlbmN5MiRjb250cmFzdHMKYGBgCgpDYWxjdWxhdGUgZWZmIHNpemVzCmBgYHtyfQoKYGBgCgpQbG90IG5ldHdvcmsgc3VidHJhY3Rpb25zIGZvciBtb2RlcmF0ZSB0byBoaWdoIGVmZiBzaXplcwpgYGB7cn0KbWVhbjEgPSBzZXRfMSRwb2ludHMgJT4lIGRwbHlyOjpmaWx0ZXIoUGhhc2UgPT0gMSwgUm9sZSA9PSAiRW5naW5lZXIiKQptZWFuMiA9IHNldF8xJHBvaW50cyAlPiUgZHBseXI6OmZpbHRlcihQaGFzZSA9PSAxLCBSb2xlID09ICJQcm9kdWN0RGVzaWduZXIiKQoKbHdfMSA9IHNldF8xJGxpbmUud2VpZ2h0cyAlPiUgZHBseXI6OmZpbHRlcihQaGFzZSA9PSAxLCBSb2xlID09ICJFbmdpbmVlciIpICU+JSBhcy5tYXRyaXgoKSAlPiUgY29sTWVhbnMoKQpsd18yID0gc2V0XzEkbGluZS53ZWlnaHRzICU+JSBkcGx5cjo6ZmlsdGVyKFBoYXNlID09IDEsIFJvbGUgPT0gIlByb2R1Y3REZXNpZ25lciIpICU+JSBhcy5tYXRyaXgoKSAlPiUgY29sTWVhbnMoKQoKCnBsb3QgPSBlbmEucGxvdChzZXRfMSwgdGl0bGUgPSAiTmV0d29yayBTdWJ0cmFjdGlvbnMiKSAlPiUgCiAgICAgICAgICBlbmEucGxvdC5wb2ludHMocG9pbnRzID0gbWVhbjEsIGNvbG9ycyA9IGMoImJsdWUiKSkgJT4lIAogICAgICAgICAgZW5hLnBsb3QucG9pbnRzKHBvaW50cyA9IG1lYW4yLCBjb2xvcnMgPSBjKCJyZWQiKSkgJT4lIAogICAgICAgICAgZW5hLnBsb3QuZ3JvdXAocG9pbnQgPSBtZWFuMSwgY29sb3JzID1jKCJibHVlIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlkZW5jZS5pbnRlcnZhbCA9ICJib3giKSAlPiUgCiAgICAgICAgICBlbmEucGxvdC5ncm91cChwb2ludCA9IG1lYW4yLCBjb2xvcnMgPWMoInJlZCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2UuaW50ZXJ2YWwgPSAiYm94IikgJT4lCiAgICAgICAgICBlbmEucGxvdC5uZXR3b3JrKG5ldHdvcmsgPSBsd18xIC0gbHdfMiwgY29sb3JzID0gYygiYmx1ZSIsInJlZCIpKQoKcGxvdCRwbG90CmBgYAoKCg==